#ifndef MEASUREMENTALGORITHMBASE_H
#define MEASUREMENTALGORITHMBASE_H

#include <QObject>
#include <QVariantMap>
#include <QString>
#include <QWidget>
#include <QFlags>

// 声明接口ID
#define MEASUREMENTALGORITHMBASE_IID "CameraImageAcquisition.MeasurementAlgorithmBase/1.0"

/**
 * @brief 测量方式枚举
 * 定义算法支持的测量方式类型
 */
enum class MeasurementMode {
    None = 0x00,                    // 不支持任何测量方式
    HorizontalSingleLine = 0x01,    // 横线单线测量
    HorizontalDoubleLine = 0x02,    // 横线双线间距测量
    VerticalSingleLine = 0x04,      // 纵线单线测量
    VerticalDoubleLine = 0x08,      // 纵线双线间距测量
    RectangleRegion = 0x10          // 矩形区域测量
};

// 声明MeasurementMode为QFlags类型，支持按位或操作
Q_DECLARE_FLAGS(MeasurementModes, MeasurementMode)
// 声明为Qt元类型，使其可用于信号槽
Q_DECLARE_METATYPE(MeasurementMode)
Q_DECLARE_METATYPE(MeasurementModes)

/**
 * @brief 测量算法统一接口基类
 * 定义所有测量算法必须实现的核心接口，提供统一的测量流程。
 * 子类需继承此类并实现具体的测量逻辑，确保算法模块的可扩展性和互换性。
 */
class MeasurementAlgorithmBase : public QObject {
    Q_OBJECT
public:
    explicit MeasurementAlgorithmBase(QObject *parent = nullptr) : QObject(parent) {}
    virtual ~MeasurementAlgorithmBase() = default;

    /**
     * @brief 开始测量
     * 初始化测量环境，准备进行测量操作
     * @param imageId 图像唯一标识符
     */
    virtual void startMeasurement(const QString &imageId) = 0;
    
    /**
     * @brief 结束测量
     * 清理测量资源，结束当前测量任务
     */
    virtual void endMeasurement() = 0;
    
    /**
     * @brief 设置测量参数
     * @param params 测量参数集合
     */
    virtual void setMeasurementParameters(const QVariantMap &params) = 0;
    
    /**
     * @brief 设置缩放比例
     * @param scale 缩放比例值
     */
    virtual void setScale(double scale) = 0;
    
    /**
     * @brief 设置单位转换信息
     * @param xUnit X轴单位
     * @param yUnit Y轴单位
     * @param lengthRatio 长度单位转换比例
     * @param timeRatio 时间单位转换比例
     * @param wavelengthRatio 波长单位转换比例
     * @param lengthUnit 长度单位
     * @param timeUnit 时间单位
     * @param wavelengthUnit 波长单位
     */
    virtual void setUnitConversionInfo(int xUnit, int yUnit, double lengthRatio, double timeRatio, double wavelengthRatio,
                                     const QString &lengthUnit, const QString &timeUnit, const QString &wavelengthUnit) = 0;
    
    /**
     * @brief 获取当前处理的图像ID
     * @return 图像ID
     */
    virtual QString currentImageId() const = 0;

    /**
     * @brief 获取算法名称
     * @return 算法名称
     */
    virtual QString algorithmName() const = 0;

    /**
     * @brief 初始化算法
     * 用于在算法加载后进行初始化操作，例如注册算法widget
     */
    virtual void initialize() = 0;
    
    /**
     * @brief 获取测量参数
     * @return 包含测量参数的QVariantMap
     */
    virtual QVariantMap getMeasurementParameters() const = 0;
    
    /**
     * @brief 获取算法支持的测量模式
     * @return 支持的测量模式集合
     */
    virtual MeasurementModes getSupportedModes() const = 0;
    
    /**
     * @brief 设置测量结果（用于撤销/重做操作）
     * @param measurementResult 测量结果
     */
    virtual void setMeasurementResult(const QVariantMap &measurementResult) = 0;

signals:
    /**
     * @brief 测量完成信号
     * @param imageId 图像唯一标识符
     * @param measurementResult 测量结果
     */
    void measurementProcessed(const QString &imageId, const QVariantMap &measurementResult);

    /**
     * @brief 注册测量算法（用于显示按钮）
     * @param algorithmName 算法名称
     * @param iconPath 算法图标路径
     */
    void registerMeasurementAlgorithm(const QString& algorithmName, const QString& iconPath);
    
    /**
     * @brief 注册测量结果显示widget（在启动测量时注册）
     * @param algorithmName 算法名称
     * @param widget 结果显示widget指针
     */
    void registerMeasurementResultWidget(const QString& algorithmName, QWidget* widget);
    
    /**
     * @brief 注册自定义测量工具widget
     * @param algorithmName 算法名称
     * @param widget 自定义测量工具widget指针
     */
    void registerMeasurementToolWidget(const QString& algorithmName, QWidget* widget);
    
protected:
    QVariantMap m_params; // 算法参数存储
    QString m_imageId; // 当前处理的图像ID
    bool m_processed; // 处理状态标志
};

// 声明接口
Q_DECLARE_INTERFACE(MeasurementAlgorithmBase, MEASUREMENTALGORITHMBASE_IID)

#endif // MEASUREMENTALGORITHMBASE_H
